﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace MachineVision.Extensions
{
    public static class LanguageHelper
    {
        //用于存储当前应用程序正在使用的语言代码（例如 "en-US" 代表英语，"zh-CN" 代表简体中文）。
        public static string AppCurrentLangeuage {  get; set; }

        //KeyValues: 一个字典，用来存储当前语言的所有资源键值对。
        public static Dictionary<string, string> KeyValues { get; set; }

        public static void SetLangeuage(string key)
        {
            #region 真正执行语言的变更
            /*
                Application.Current:Application.Current指的是当前运行的WPF应用程序的实例。
                Resources:Application.Current.Resources指的是此应用程序实例的顶级资源字典。这个资源字典用于定义全应用程序范围的资源，如样式、模板等。
                MergedDictionaries:Application.Current.Resources.MergedDictionaries是一个资源字典的集合，这些资源字典可以从外部定义并合并进来。这是一种组织和重用资源的手段，允许将资源集中在不同的文件中，并在需要时将其合并到全局字典中。
                FirstOrDefault:FirstOrDefault是LINQ（Language Integrated Query）的一个方法，用于从序列中返回第一个满足条件的元素，或者如果没有找到满足条件的元素则返回默认值（在资源字典的上下文中是null）。
             */

            //这行代码的作用是在应用程序的合并资源字典集合中查找第一个源路径包含指定键（key）的ResourceDictionary。如果找到了符合条件的资源字典，它会返回这个资源字典对象，否则返回null。
            //<ResourceDictionary Source="pack://application:,,,/MachineVision;component/Assets/en-US.xaml"/>  当前key是en-US，那么该ResourceDictionary的Source包含en-US，所以返回当前资源字典对象
            var resource = Application.Current.Resources.MergedDictionaries
                .FirstOrDefault(t=>t.Source!=null && t.Source.OriginalString!=null && t.Source.OriginalString.Contains(key));

            if (resource != null)
            {
                //如果找到了符合条件的资源字典，这段代码就会将其从当前应用的合并资源字典集合中移除。这样做是为了后面能重新添加该资源字典，触发WPF刷新资源。
                Application.Current.Resources.MergedDictionaries.Remove(resource);
            }

            //将刚才移除的资源字典重新添加到合并资源字典集合中，这种移除再添加的操作可以促使应用重新加载该资源字典，应用更新的语言资源。
            Application.Current.Resources.MergedDictionaries.Add(resource);
            #endregion

            //实例化一个新的字典keyValues，用于保存从资源字典中提取的键值对数据。
            Dictionary<string, string> keyValues = new Dictionary<string,string>();

            //遍历之前找到的资源字典中的每个条目，将其键和值转换成字符串，并添加到keyValues字典中。
            foreach (DictionaryEntry item in resource)
            {
                keyValues.Add(item.Key.ToString(), item.Value.ToString());
            }

            //将静态属性AppCurrentLanguage设置为方法参数key的值，KeyValues设置为之前创建的keyValues字典。
            AppCurrentLangeuage = key;
            KeyValues = keyValues;

            /*
                Thread.CurrentThread：这是指.NET中的System.Threading命名空间下的Thread类的静态属性CurrentThread。它返回代表当前正在执行的线程的Thread实例。
                CurrentUICulture：CurrentThread实例的CurrentUICulture属性代表了当前线程的UI文化信息。UI文化信息决定了翻译的字符串资源、日期和时间格式、数值格式等与文化相关的信息如何展示。这对于创建多语言应用程序来说非常重要。
                new System.Globalization.CultureInfo(key)：这一部分构造了一个新的CultureInfo实例。CultureInfo类位于System.Globalization命名空间中，代表了特定的文化信息，例如语言、国家/地区。在这个表达式中，key变量预期是一个代表特定文化的字符串标识符，如"en-US"代表美国英语，"zh-CN"代表中国大陆的简体中文。
                =赋值操作：最后，赋值操作将新创建的CultureInfo实例分配给CurrentThread的CurrentUICulture属性。这意味着当前线程的所有UI相关操作都将按照指定的文化信息来执行。
             */
            //更新当前线程的UI文化信息为新的语言文化 (CultureInfo)，用于改变WPF应用程序的显示语言。
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(key);
        }
    }
}
